import {ref, Ref} from "vue"
import http from "@/request/request"

const alldata = ref<any>({})
/*********************************************************************************
 传入字典关键字，向后台获取关键字下属的所有字段，并缓存结果
 key是父级字典的名字
 shuaxin是强制刷新
 loading是外层的加载状态
 *********************************************************************************/
export const useCacheDict = (key: string, shuaxin: boolean = false, loading: Ref | null = null) => {
    const data = ref([])
    let load = false
    const getDataFunc = () => {
        console.log(alldata.value, alldata.value[key], "都是什么啊alldata.value")
        load = true
        loading ? loading.value = true : ""
        const params = {
            name: key,
        }
        http.zidianfilter(params).then((res: any) => {
            load = false
            loading ? loading.value = false : ""
            if (res.data.code === 0) {
                alldata.value[key] = res.data.items
                data.value = alldata.value[key]
            } else {
                // @ts-ignore
                const message = window['$message']
                message.error(res.data.error.toString() || `${key}获取失败`)
            }
        }).catch((err: any) => {
            load = false
            loading ? loading.value = false : ""
            // @ts-ignore
            const message = window['$message']
            message.error(err.toString() || `${key}获取失败`)
        })
    }

    /*
    * 初始化逻辑
    * 1.是否强制刷新，如果是，判断是否正在获取数据，如果是，直接返回
    * 2.如果强制刷新，并且不是正在获取，发起http请求
    * 3.如果不强制刷新，判断总数据中是否已经存在数据，如果不存在，发起http请求
    * 4.如果总数据中存在数据，直接赋值
    * */
    if (shuaxin) {
        if (!load) {
            getDataFunc()
        }
    } else {
        if (alldata.value[key]) {
            data.value = alldata.value[key]
        } else {
            alldata.value[key] = null
            getDataFunc()
        }
    }
    // 最后返回响应式数据
    return data
}

/*********************************************************************************
 传入url，向后台获取这个url的结果，缓存到内存类，支持所有的url
 url就是将要请求的url，如果是http开头的，使用axios创建请求，如果不是，使用封装好的axios实例请求
 shuaxin是强制刷新
 loading是外层的加载状态
 *********************************************************************************/
import axioshttp from "@/request/index"
import axios from "axios"

interface axiosobj {
    url: string,
    method: "get" | "post" | "put" | "delete" | undefined,
    params: any,
    data: any,
}

const httpregx = /^http.*?/
export const useCacheAll = (obj: axiosobj, shuaxin: boolean = false, loading: Ref | null = null, func: Function | null = null) => {
    const data = ref([])
    let load = false        // 判断是否正在获取
    const getDataFunc = () => {
        load = true
        loading ? loading.value = true : ""
        if (httpregx.test(obj.url)) {
            axios(obj).then(res => {
                load = false
                loading ? loading.value = false : ""
                if (res.status === 200) {
                    if(func){
                        func(res.data,alldata,data)
                    }else{
                        alldata.value[obj.url] = data.value =  res.data
                    }
                } else {
                    // @ts-ignore
                    const message = window['$message']
                    message.error(`${obj.url}获取失败`)
                }
            }).catch(() => {
                load = false
                loading ? loading.value = false : ""
                // @ts-ignore
                const message = window['$message']
                message.error(`${obj.url}获取失败`)
            })
        } else {
            axioshttp(obj).then((res:any) => {
                load = false
                loading ? loading.value = false : ""
                if (res.data.code === 0) {
                    if(func){
                        func(res.data,alldata,data)
                    }else{
                        alldata.value[obj.url] = data.value =  res.data
                    }
                } else {
                    // @ts-ignore
                    const message = window['$message']
                    message.error(`${obj.url}获取失败`)
                }
            }).catch((err: any) => {
                load = false
                loading ? loading.value = false : ""
                // @ts-ignore
                const message = window['$message']
                message.error(`${obj.url}获取失败`)
            })
        }

    }

    /*
    * 初始化逻辑
    * 1.是否强制刷新，如果是，判断是否正在获取数据，如果是，直接返回
    * 2.如果强制刷新，并且不是正在获取，发起http请求
    * 3.如果不强制刷新，判断总数据中是否已经存在数据，如果不存在，发起http请求
    * 4.如果总数据中存在数据，直接赋值
    * */
    if (shuaxin) {
        if (!load) {
            getDataFunc()
        }
    } else {
        if (alldata.value[obj.url]) {
            data.value = alldata.value[obj.url]
        } else {
            alldata.value[obj.url] = null
            getDataFunc()
        }
    }
    // 最后返回响应式数据
    return data
}